Skip to content

Conversation

@michelle0927
Copy link
Collaborator

@michelle0927 michelle0927 commented Aug 29, 2025

Resolves #18055

Summary by CodeRabbit

  • New Features

    • Booking Experts: Added actions to add a guest, create agenda periods, fetch complex prices, list bookings, list inventory objects, and search contacts (with input validation and summaries).
    • Booking Experts: Added dynamic, paginated dropdowns and a standardized HTTP API client with header-based authentication.
    • Booking Experts: New polling event sources for new/updated bookings and new/updated inventory objects.
  • Chores

    • Booking Experts: Bumped package version to 0.1.0 and added a dependency.
  • Style

    • Afosto: Minor formatting update (trailing newline).

@vercel
Copy link

vercel bot commented Aug 29, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Preview Comments Updated (UTC)
pipedream-docs Ignored Ignored Aug 29, 2025 5:09pm
pipedream-docs-redirect-do-not-edit Ignored Ignored Aug 29, 2025 5:09pm

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 29, 2025

Walkthrough

Adds a Booking Experts app client with axios-based requests and x-api-key auth, multiple actions (list/create/search/add-guest/get-complex-prices), a reusable polling base and three polling sources, dynamic propDefinitions, package bump/dependency, and a trivial newline formatting change in the Afosto app file.

Changes

Cohort / File(s) Change Summary
Afosto Formatting
components/afosto/afosto.app.mjs
Trailing newline added; no functional changes.
Booking Experts App Client & Props
components/booking_experts/booking_experts.app.mjs
New axios-based HTTP layer, x-api-key auth, _makeRequest helper, many public methods for administrations/bookings/owners/channels/reservations/master_price_lists/complex_prices/inventory_objects/rentables/contacts/createAgendaPeriod/addGuestToReservation, and dynamic propDefinitions (administrationId, ownerId, channelId, reservationId, masterPriceListId, inventoryObjectId, rentableId, page, perPage).
Booking Experts Actions
components/booking_experts/actions/*/add-guest-to-reservation.mjs, .../create-agenda-period.mjs, .../get-complex-prices.mjs, .../list-bookings.mjs, .../list-inventory-objects.mjs, .../search-contacts.mjs
Adds actions: Add Guest to Reservation (POST), Create Agenda Period (POST), Get Complex Prices (GET), List Bookings (GET with filters/pagination), List Inventory Objects (GET with filters/pagination), Search Contacts (GET with input validation and 404 handling).
Polling Base for Sources
components/booking_experts/sources/common/base-polling.mjs
New reusable polling base with timestamp tracking (db), paginated fetching, processEvent with optional limit, deploy bootstrap (initial sync), run loop, and required getResourceFn/generateMeta overrides (ConfigurationError enforcement).
Booking Experts Sources
components/booking_experts/sources/new-booking-created/*.mjs, .../booking-updated/*.mjs, .../inventory-object-updated/*.mjs
Adds three polling sources using the base: New Booking Created (sort by created_at), Booking Updated (sort by updated_at), Inventory Object Updated (sort by updated_at); each emits meta per item.
Package Metadata
components/booking_experts/package.json
Bumps version to 0.1.0 and adds dependency "@pipedream/platform": "^3.1.0".

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant Action as Pipedream Action
  participant App as BookingExperts App Client
  participant API as Booking Experts API

  User->>Action: Provide props
  Action->>App: call method (e.g., createAgendaPeriod / addGuestToReservation / listBookings)
  App->>App: _makeRequest (build URL, headers with x-api-key)
  App->>API: HTTP request
  API-->>App: HTTP response (data)
  App-->>Action: data
  Action-->>User: summary + data
Loading
sequenceDiagram
  autonumber
  participant Source as Source (extends Base)
  participant Base as Base Polling
  participant App as BookingExperts App Client
  participant API as Booking Experts API
  participant DB as Source DB
  participant Sink as Event Emitter

  rect rgb(245,248,255)
  note right of Source: Deploy (initial sync)
  Source->>Base: deploy()
  Base->>DB: _getLastTs()
  loop pages (limit)
    Base->>App: getResourceFn(args with sort & page)
    App->>API: GET with pagination
    API-->>App: data[]
    App-->>Base: data[]
    Base->>Sink: emit item + meta (filtered by ts)
  end
  Base->>DB: _setLastTs(newTs)
  end

  rect rgb(245,255,245)
  note right of Source: Run (interval)
  Source->>Base: run()
  Base->>DB: _getLastTs()
  loop while new pages
    Base->>App: getResourceFn(next page)
    App->>API: GET
    API-->>App: data[]
    App-->>Base: data[]
    Base->>Sink: emit item + meta
  end
  Base->>DB: _setLastTs(newTs)
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Assessment against linked issues

Objective Addressed Explanation
App scaffolding and authenticated client for Booking Experts (#18055)
GET endpoints: administrations, bookings, owners, channels, inventory_objects, master_price_lists, complex_prices (subset of #18055)
Create agenda periods: POST /maintenance_agenda_period and POST /external_blocked_agenda_period (#18055)
Search contacts / contacts lookup (#18055)

Out-of-scope changes

Code Change Explanation
Trailing newline added (components/afosto/afosto.app.mjs) Formatting-only change unrelated to Booking Experts objectives (#18055); not functionally relevant.

Poem

I hop through code with eager paws,
New endpoints sprout like garden laws—
Polls that hum and actions bright,
Keys held close throughout the night.
I nibble bugs, then send events—🥕✨


📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between ba11be3 and 74d4478.

📒 Files selected for processing (1)
  • components/booking_experts/actions/search-contacts/search-contacts.mjs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • components/booking_experts/actions/search-contacts/search-contacts.mjs
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Lint Code Base
  • GitHub Check: pnpm publish
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Verify TypeScript components
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch issue-18055

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore or @coderabbit ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
components/afosto/afosto.app.mjs (1)

7-9: Remove logging of auth keys.
Leaking Object.keys(this.$auth) to logs can expose sensitive metadata. Remove or guard behind a debug flag.

Apply this diff:

   methods: {
     // this.$auth contains connected account data
     authKeys() {
-      console.log(Object.keys(this.$auth));
+      if (process.env.DEBUG === "true") {
+        console.debug("Afosto auth keys present");
+      }
     },
   },
🧹 Nitpick comments (6)
components/booking_experts/actions/get-complex-prices/get-complex-prices.mjs (1)

3-7: Double-check endpoint shape and pagination meta.
If the endpoint returns JSON:API links/meta, consider exposing them for callers that need pagination beyond page[size]/page[number].

components/booking_experts/sources/new-inventory-object-created/new-inventory-object-created.mjs (1)

33-39: Harden ts parsing and improve summary

Guard against invalid/missing dates and include a friendlier summary when a name/label exists.

-    generateMeta(inventoryObject) {
-      return {
-        id: inventoryObject.id,
-        summary: `New inventory object created: ${inventoryObject.id}`,
-        ts: Date.parse(inventoryObject.attributes.created_at),
-      };
-    },
+    generateMeta(inventoryObject) {
+      const attrs = inventoryObject?.attributes ?? {};
+      const ts = Date.parse(attrs.created_at) || Date.now();
+      const title = attrs.name || attrs.label || inventoryObject.id;
+      return {
+        id: inventoryObject.id,
+        summary: `New inventory object created: ${title}`,
+        ts,
+      };
+    },
components/booking_experts/sources/booking-updated/booking-updated.mjs (1)

36-41: Harden ts parsing and make summary more helpful

Protect against missing/invalid updated_at and show human-friendly identifier if available.

-    generateMeta(booking) {
-      return {
-        id: booking.id,
-        summary: `Booking updated: ${booking.id}`,
-        ts: Date.parse(booking.attributes.updated_at),
-      };
-    },
+    generateMeta(booking) {
+      const attrs = booking?.attributes ?? {};
+      const ts = Date.parse(attrs.updated_at) || Date.now();
+      const title = attrs.reference || attrs.code || booking.id;
+      return {
+        id: booking.id,
+        summary: `Booking updated: ${title}`,
+        ts,
+      };
+    },
components/booking_experts/sources/inventory-object-updated/inventory-object-updated.mjs (1)

36-41: Harden ts parsing and improve summary

Guard date parsing and prefer a readable label/name when present.

-    generateMeta(inventoryObject) {
-      return {
-        id: inventoryObject.id,
-        summary: `Inventory object updated: ${inventoryObject.id}`,
-        ts: Date.parse(inventoryObject.attributes.updated_at),
-      };
-    },
+    generateMeta(inventoryObject) {
+      const attrs = inventoryObject?.attributes ?? {};
+      const ts = Date.parse(attrs.updated_at) || Date.now();
+      const title = attrs.name || attrs.label || inventoryObject.id;
+      return {
+        id: inventoryObject.id,
+        summary: `Inventory object updated: ${title}`,
+        ts,
+      };
+    },
components/booking_experts/actions/add-guest-to-reservation/add-guest-to-reservation.mjs (2)

6-6: Fix double period in description

Minor grammar nit.

-  description: "Add a guest to a reservation.. [See the documentation](https://developers.bookingexperts.com/reference/administration-reservation-guests-create)",
+  description: "Add a guest to a reservation. [See the documentation](https://developers.bookingexperts.com/reference/administration-reservation-guests-create)",

93-94: Make summary more informative

Include reservation and guest in the summary for easier run visibility.

-    $.export("$summary", "Guest added to reservation");
-    return data;
+    $.export("$summary", `Added guest ${this.firstName} ${this.lastName} to reservation ${this.reservationId}`);
+    return data;
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 59b21cc and ba11be3.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (14)
  • components/afosto/afosto.app.mjs (1 hunks)
  • components/booking_experts/actions/add-guest-to-reservation/add-guest-to-reservation.mjs (1 hunks)
  • components/booking_experts/actions/create-agenda-period/create-agenda-period.mjs (1 hunks)
  • components/booking_experts/actions/get-complex-prices/get-complex-prices.mjs (1 hunks)
  • components/booking_experts/actions/list-bookings/list-bookings.mjs (1 hunks)
  • components/booking_experts/actions/list-inventory-objects/list-inventory-objects.mjs (1 hunks)
  • components/booking_experts/actions/search-contacts/search-contacts.mjs (1 hunks)
  • components/booking_experts/booking_experts.app.mjs (1 hunks)
  • components/booking_experts/package.json (2 hunks)
  • components/booking_experts/sources/booking-updated/booking-updated.mjs (1 hunks)
  • components/booking_experts/sources/common/base-polling.mjs (1 hunks)
  • components/booking_experts/sources/inventory-object-updated/inventory-object-updated.mjs (1 hunks)
  • components/booking_experts/sources/new-booking-created/new-booking-created.mjs (1 hunks)
  • components/booking_experts/sources/new-inventory-object-created/new-inventory-object-created.mjs (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2024-12-12T19:23:09.039Z
Learnt from: jcortes
PR: PipedreamHQ/pipedream#14935
File: components/sailpoint/package.json:15-18
Timestamp: 2024-12-12T19:23:09.039Z
Learning: When developing Pipedream components, do not add built-in Node.js modules like `fs` to `package.json` dependencies, as they are native modules provided by the Node.js runtime.

Applied to files:

  • components/booking_experts/package.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Verify TypeScript components
  • GitHub Check: Publish TypeScript components
  • GitHub Check: pnpm publish
  • GitHub Check: Lint Code Base
🔇 Additional comments (18)
components/afosto/afosto.app.mjs (1)

11-11: Trailing newline only — OK.
No functional changes.

components/booking_experts/package.json (2)

3-3: Version bump to 0.1.0 — OK.
Matches the new surface area added in this PR.


15-17: Verify @pipedream/platform v3.1.0 API availability
Confirm that the specific exports your code relies on—such as axios imports and ConfigurationError—are present in @pipedream/platform version 3.1.0 (e.g. by reviewing the v3.1.0 source or changelog).

components/booking_experts/booking_experts.app.mjs (1)

186-254: Unable to verify nested endpoints due to missing credentials. The script returned only an errors array (no data) because BOOKING_EXPERTS_API_KEY and/or ADMIN_ID weren’t set. Provide valid values or consult the Booking Experts API docs to confirm whether these /administrations/{id}/… routes are correct.

components/booking_experts/actions/search-contacts/search-contacts.mjs (1)

1-9: Provide the official parameter list for /contacts/search/first
Share the Booking Experts API docs snippet that lists all supported query parameters (with exact names and casing) for the /contacts/search/first endpoint so we can confirm whether email, phone, and name are valid.

components/booking_experts/actions/list-inventory-objects/list-inventory-objects.mjs (1)

43-55: Include $ for request context and avoid sending undefined query params

Pass $ to the app method for logging/observability, and build params without undefined values to prevent sending "undefined" strings.
[ suggest_essential_refactor ]

-    const { data } = await this.bookingExperts.listInventoryObjects({
-      administrationId: this.administrationId,
-      params: {
-        "filter[name]": this.name,
-        "filter[labels]": this.labels
-          ? this.labels.join(",")
-          : undefined,
-        "page[number]": this.page,
-        "page[size]": this.perPage,
-      },
-    });
+    const params = {
+      ...(this.name && { "filter[name]": this.name }),
+      ...(this.labels?.length && { "filter[labels]": this.labels.join(",") }),
+      ...(this.page && { "page[number]": this.page }),
+      ...(this.perPage && { "page[size]": this.perPage }),
+    };
+    const { data } = await this.bookingExperts.listInventoryObjects({
+      $,
+      administrationId: this.administrationId,
+      params,
+    });
components/booking_experts/actions/create-agenda-period/create-agenda-period.mjs (3)

50-59: Make rentableId optional and validate that at least one relation is provided

API commonly requires either an inventory object or a rentable. Mark rentableId optional and enforce a guard in run.
[ suggest_essential_refactor ]

-    rentableId: {
+    rentableId: {
       propDefinition: [
         bookingExperts,
         "rentableId",
         (c) => ({
           administrationId: c.administrationId,
           inventoryObjectId: c.inventoryObjectId,
         }),
       ],
+      optional: true,
+      description: "Rentable to associate. Provide either this or an Inventory Object.",
     },

61-95: Add input validation (date order, required relationships) and build relationships conditionally

Prevent invalid requests and clearer errors.
[ suggest_essential_refactor ]

   async run({ $ }) {
-    const { data } = await this.bookingExperts.createAgendaPeriod({
+    const start = Date.parse(this.startDate);
+    const end = Date.parse(this.endDate);
+    if (Number.isNaN(start) || Number.isNaN(end) || start > end) {
+      throw new Error("Invalid dates: ensure Start Date and End Date are valid and start <= end.");
+    }
+    if (!this.rentableId && !this.inventoryObjectId) {
+      throw new Error("Provide either `rentableId` or `inventoryObjectId`.");
+    }
+
+    const relationships = {};
+    if (this.inventoryObjectId) {
+      relationships.inventory_object = { data: { type: "inventory_object", id: this.inventoryObjectId } };
+    }
+    if (this.rentableId) {
+      relationships.rentable = { data: { type: "rentable", id: this.rentableId } };
+    }
+
+    const { data } = await this.bookingExperts.createAgendaPeriod({
       $,
       administrationId: this.administrationId,
       type: this.type,
       data: {
         data: {
           type: "agenda_period",
           attributes: {
             label: this.label,
             start_date: this.startDate,
             end_date: this.endDate,
           },
-          relationships: {
-            inventory_object: this.inventoryObjectId
-              ? {
-                data: {
-                  type: "inventory_object",
-                  id: this.inventoryObjectId,
-                },
-              }
-              : undefined,
-            rentable: {
-              data: {
-                type: "rentable",
-                id: this.rentableId,
-              },
-            },
-          },
+          relationships,
         },
       },
     });

6-6: Confirm JSON:API type value

Ensure the payload’s resource "type": "agenda_period" matches Booking Experts’ expected resource type for the selected endpoint (e.g., maintenance vs external blocked).
[ request_verification ]
Would you like me to cross-check the docs and adjust the type accordingly?

components/booking_experts/actions/list-bookings/list-bookings.mjs (2)

61-73: Bug: references to undefined createdAt / updatedAt props; filter keys may send undefined

Either add these props or remove the filters and omit undefined values. Also pass $ and mark optional filters as optional.
[ raise_critical_issue ]

   props: {
     bookingExperts,
     administrationId: {
       propDefinition: [
         bookingExperts,
         "administrationId",
       ],
     },
     ownerId: {
       propDefinition: [
         bookingExperts,
         "ownerId",
         (c) => ({
           administrationId: c.administrationId,
         }),
       ],
-      description: "Filter by owner",
+      description: "Filter by owner",
+      optional: true,
     },
     channelId: {
       propDefinition: [
         bookingExperts,
         "channelId",
         (c) => ({
           administrationId: c.administrationId,
         }),
       ],
-      description: "Filter by channel",
+      description: "Filter by channel",
+      optional: true,
     },
@@
     reservationId: {
@@
       optional: true,
     },
+    createdAt: {
+      type: "string",
+      label: "Created At",
+      description: "Filter by created_at (e.g. `2025-08-01..2025-08-31` or exact ISO timestamp), if supported by the API.",
+      optional: true,
+    },
+    updatedAt: {
+      type: "string",
+      label: "Updated At",
+      description: "Filter by updated_at (range or exact), if supported by the API.",
+      optional: true,
+    },
   async run({ $ }) {
-    const { data } = await this.bookingExperts.listBookings({
-      $,
-      administrationId: this.administrationId,
-      params: {
-        "filter[owner]": this.ownerId,
-        "filter[channel]": this.channelId,
-        "filter[reservations]": this.reservationId,
-        "filter[created_at]": this.createdAt,
-        "filter[updated_at]": this.updatedAt,
-        "page[number]": this.page,
-        "page[size]": this.perPage,
-      },
-    });
+    const params = {
+      ...(this.ownerId && { "filter[owner]": this.ownerId }),
+      ...(this.channelId && { "filter[channel]": this.channelId }),
+      ...(this.reservationId && { "filter[reservations]": this.reservationId }),
+      ...(this.createdAt && { "filter[created_at]": this.createdAt }),
+      ...(this.updatedAt && { "filter[updated_at]": this.updatedAt }),
+      ...(this.page && { "page[number]": this.page }),
+      ...(this.perPage && { "page[size]": this.perPage }),
+    };
+    const { data } = await this.bookingExperts.listBookings({
+      $,
+      administrationId: this.administrationId,
+      params,
+    });

66-70: Verify filter param names against the API

Double-check whether the API expects singular vs plural keys (e.g., filter[reservation] vs filter[reservations]) and accepted date filter formats.
[ request_verification ]
I can adjust the params once confirmed.

components/booking_experts/sources/common/base-polling.mjs (2)

36-67: Pagination stops after first page; uninitialized hasMore and potential event loss on equal timestamps

Initialize hasMore, bind the resource fn, default-sort by timestamp if absent, and use >= to avoid skipping events sharing the same timestamp (dedupe will handle duplicates).
[ raise_critical_issue ]

-      const items = [];
-      let total, hasMore, count = 0;
+      const items = [];
+      let total, hasMore = true, count = 0;
-      args = {
+      args = {
         ...args,
         params: {
           ...args?.params,
+          // default to newest-first by timestamp if not provided
+          sort: args?.params?.sort ?? `-${tsField}`,
           "page[number]": 1,
           "page[size]": 100,
         },
       };
       do {
-        const { data } = await resourceFn(args);
+        const boundResource = this.getResourceFn().bind(this.bookingExperts);
+        const { data } = await boundResource(args);
         total = data?.length;
         if (!total) {
           break;
         }
-        for (const item of data) {
+        hasMore = true;
+        for (const item of data) {
           const ts = Date.parse(item.attributes[tsField]);
-          if (ts > lastTs) {
+          if (ts >= lastTs) {
             items.push(item);
             if (limit && ++count >= limit) {
               hasMore = false;
               break;
             }
           } else {
             hasMore = false;
             break;
           }
         }
-        args.params["page[number]"]++;
-      } while (hasMore && total === args.params["page[size]"]);
+        if (hasMore && total === args.params["page[size]"]) {
+          args.params["page[number]"]++;
+        } else {
+          hasMore = false;
+        }
+      } while (hasMore);

72-77: Anchor lastTs correctly to avoid dropping items

Keeping lastTs at the newest ts is fine with >= filtering plus unique dedupe. Consider persisting the newest ts across the page, not only the first item.
[ suggest_optional_refactor ]

-      this._setLastTs(Date.parse(items[0].attributes[tsField]));
+      const newestTs = Math.max(...items.map((i) => Date.parse(i.attributes[tsField])));
+      this._setLastTs(newestTs);
components/booking_experts/sources/new-booking-created/new-booking-created.mjs (2)

22-24: Bind the app method to preserve this context

Returning an unbound method will lose its this and likely throw at runtime. Bind to the app instance.
[ raise_critical_issue ]

-    getResourceFn() {
-      return this.bookingExperts.listBookings;
-    },
+    getResourceFn() {
+      return this.bookingExperts.listBookings.bind(this.bookingExperts);
+    },

26-32: Pass sort by created_at explicitly (already done) and consider adding $ if your app wrapper uses it

If the app method benefits from $, update base-polling to pass it or wrap here.
[ request_verification ]
Do you want me to extend the base to pass $ through to the app calls?

components/booking_experts/sources/booking-updated/booking-updated.mjs (1)

25-35: Confirmed base-polling uses getTsField() for checkpointing and the API consistently applies sort: "-updated_at"; no changes required.

components/booking_experts/actions/add-guest-to-reservation/add-guest-to-reservation.mjs (2)

79-80: Confirm JSON:API type value
The Booking Experts docs list this resource’s type as “reservation_guests” for the create‐guest endpoint; please double-check that using “guest” here is correct.


1-25: Verified: reservationId propDefinition and addGuestToReservation method are present
The reservationId prop is defined with async options scoped by administrationId, and the addGuestToReservation client method exists in the app.

Copy link
Collaborator

@luancazarine luancazarine left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @michelle0927, LGTM! Ready for QA!

@vunguyenhung vunguyenhung merged commit 35984e1 into master Sep 2, 2025
10 checks passed
@vunguyenhung vunguyenhung deleted the issue-18055 branch September 2, 2025 02:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Booking Experts

4 participants